const WebSocket = require('ws')
const { v4: uuidv4 } = require('uuid')

// 1. 创建 websocket 服务器
const wss = new WebSocket.Server({
  port: 8080, // 监听端口
  host:'localhost', // 主机
  path:'', // 路径
  verifyClient: (info, done) => { // 验证客户端连接
    // 可以在这里进行客户端验证
    console.log('有客户端尝试连接:', info.req.url)
    done(true) // 允许连接
  },
  clientTracking: true, // 启用客户端跟踪，wss.clients 将包含所有已连接的客户端
  maxPayload: 1024 * 1024, // 最大消息大小 1MB
})

console.log('websocket 服务器已启动，监听端口 8080')

// 2. 监听客户端连接事件
wss.on('connection', (ws) => {
  console.log('有新的客户端连接了')

  // 将新的客户端添加到集合中
  // clients.add(ws);
  // 统一使用 websocket 库自带的 clients 集合

  // 3. 向单个客户端发送欢迎消息
  // ws.send('欢迎👏连接到 lzk websocket 服务器')
  sendToClient(ws, '欢迎👏连接到 lzk websocket 服务器')

  // 3.1 向所有客户端定时广播消息
  const interval = setInterval(() => {
    broadcastToAll('来自服务器定时广播消息: ' + new Date().toLocaleTimeString())
  }, 100000)

  // 4. 监听客户端发送的消息
  ws.on('message', (message) => {
    console.log('收到客户端消息:', message.toString())

    // 5. 向客户端回复消息
    ws.send(`服务器已收到你的消息: ${message.toString()}`)

    // 6. 广播消息给所有连接的客户端
    wss.clients.forEach((client) => {
      if (client !== ws && client.readyState === WebSocket.OPEN) {
        client.send(`（广播消息） 来自其他客户端: ${message.toString()}`)
      }
    })
  })

  // 7. 监听连接关闭
  ws.on('close', () => {
    console.log('客户端断开连接')
    // 清理定时器
    clearInterval(interval)
  })

  // 8. 监听错误
  ws.on('error', (error) => {
    console.log('连接错误:', error)
  })
})


// 广播给所有客户端
function broadcastToAll(message) {
  const messageStr = JSON.stringify(message);
  wss.clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(messageStr);
    }
  })
}

// 向特定客户端发送消息
function sendToClient(ws, message) {
  if (ws.readyState === WebSocket.OPEN) {
    const messageStr = JSON.stringify(message);
    ws.send(messageStr);
  }
}